/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.softnight.dao;

import br.com.softnight.db.ConnectionFactory;
import br.com.softnight.entidades.Cliente;
import br.com.softnight.entidades.ItemVenda;
import br.com.softnight.entidades.Venda;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

/**
 *
 * @author Franklin
 */
public class VendaDAO {

    //método para incluir um aluno na base de dados
    public void insere(Venda venda) throws SQLException {
    
        String insereSqlVenda = "INSERT INTO Venda ("
                + " id,"
                + " clienteId,"
                + " data"
                + " ) VALUES (?, ?, ?)";
        Connection conn = ConnectionFactory.getConnection();
        PreparedStatement pstmtVenda = conn.prepareStatement(insereSqlVenda);
        pstmtVenda.setLong(1, venda.getId());
        pstmtVenda.setLong(2, venda.getCliente().getId());
        pstmtVenda.setDate(3, venda.getData());
        pstmtVenda.executeUpdate();
        
        ArrayList<ItemVenda> itensVenda = venda.getItensVenda();
        for (ItemVenda itemVenda : itensVenda) {
            String insereSqlItemVenda = "INSERT INTO ItemVenda ("
                    + " id,"
                    + " vendaId,"
                    + " produtoId,"
                    + " quantidade,"
                    + " valorUnitario,"
                    + " valorTotal"
                    + " ) VALUES (?, ?, ?, ?, ?, ?)";
            PreparedStatement pstmtItemVenda = conn.prepareStatement(insereSqlItemVenda);
            pstmtItemVenda.setLong(1, itemVenda.getId());
            pstmtItemVenda.setLong(2, itemVenda.getVenda().getId());
            pstmtItemVenda.setLong(3, itemVenda.getProduto().getId());
            pstmtItemVenda.setInt(4, itemVenda.getQuantidade());
            pstmtItemVenda.setDouble(5, itemVenda.getValorUnitario());
            pstmtItemVenda.setDouble(6, itemVenda.getValorTotal());
            pstmtItemVenda.executeUpdate();
        }
    }

    public Venda consultaPorId(Long id) throws SQLException {
        Venda venda = null;
            
        String consultaSql = "SELECT"
                + " id,"
                + " clienteId,"
                + " data"
                + " FROM Venda WHERE id = ?";
        Connection con = ConnectionFactory.getConnection();
        PreparedStatement pstmt = con.prepareStatement(consultaSql);
        pstmt.setLong(1, id);
        ResultSet resultado = pstmt.executeQuery();
        if (resultado.next()) {
            Long clienteId = resultado.getLong("clienteId");
            java.sql.Date data = resultado.getDate("data");
            
            ClienteDAO clienteDAO = new ClienteDAO();
            Cliente cliente = clienteDAO.consultaPorId(clienteId);
            
            venda = new Venda();
            venda.setId(id);
            venda.setCliente(cliente);
            venda.setData(data);
        }

        return venda;
    }

    public ArrayList<Venda> consultaPorParametros(Long filtroId, Long filtroClienteId, Date filtroData) throws SQLException {
        ArrayList<Venda> vendas = new ArrayList<Venda>();
        SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
            
        String consultaSql = "SELECT"
                + " id,"
                + " clienteId,"
                + " data"
                + " FROM Venda WHERE 1=1 ";
        String where = (filtroId == null ? "" : (" AND id = " + String.valueOf(filtroId)) );
        where += (filtroClienteId == null ? "" : (" AND clienteId = " + String.valueOf(filtroClienteId)) );
        where += (filtroData == null ? "" : (" AND data = '" + sf.format(filtroData)) + "'" );
        
        Connection conn = ConnectionFactory.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(consultaSql + where);
        ResultSet resultado = pstmt.executeQuery();
        while (resultado.next()) {
            Long id = resultado.getLong("id");
            Long clienteId = resultado.getLong("clienteId");
            Date data = resultado.getDate("data");
            
            ClienteDAO clienteDAO = new ClienteDAO();
            Cliente cliente = clienteDAO.consultaPorId(clienteId);
            
            Venda venda = new Venda();
            venda.setId(id);
            venda.setCliente(cliente);
            venda.setData(data);

            vendas.add(venda);
        }

        return vendas;
    }

    public ArrayList<Venda> consultaTodos() throws SQLException {
        ArrayList<Venda> vendas = new ArrayList<Venda>();
            
        String consultaSql = "SELECT"
                + " id,"
                + " clienteId,"
                + " data"
                + " FROM Venda ";
        Connection con = ConnectionFactory.getConnection();
        PreparedStatement pstmt = con.prepareStatement(consultaSql);
        ResultSet resultado = pstmt.executeQuery();
        while (resultado.next()) {
            Long id = resultado.getLong("id");
            Long clienteId = resultado.getLong("clienteId");
            Date data = resultado.getDate("data");
            
            ClienteDAO clienteDAO = new ClienteDAO();
            Cliente cliente = clienteDAO.consultaPorId(clienteId);

            Venda venda = new Venda();
            venda.setId(id);
            venda.setCliente(cliente);
            venda.setData(data);
            
            vendas.add(venda);
        }

        return vendas;
    }

    public void atualiza(Venda venda) throws SQLException {
        String atualizaSql = "UPDATE Venda SET"
                + " clienteId = ?,"
                + " data = ?,"
                + " WHERE id = ?";
        Connection conn = ConnectionFactory.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(atualizaSql);
        pstmt.setLong(1, venda.getCliente().getId());
        pstmt.setDate(2, venda.getData());
        pstmt.setLong(3, venda.getId());

        pstmt.executeUpdate();
    }

    public void exclui(Long id) throws SQLException {
        String deleteSql = "DELETE FROM Venda WHERE id = ?";
        Connection conn = ConnectionFactory.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(deleteSql);
        pstmt.setLong(1, id);
        pstmt.execute();
    }
}